/*
跳跃机器人本题解法如下：
队列中保存(𝑥,𝑐𝑜𝑠𝑡)表示准备访问𝑥，从起点到𝑥 要走 𝑐𝑜𝑠𝑡步•初始化，入队(1,0)
•当队列非空时，重复以下步骤：-取出队首
𝑥,𝑐𝑜𝑠𝑡-若已经访问过𝑥或𝑥越界，则忽略-将
𝑥−1,𝑐𝑜𝑠𝑡+1,
𝑥+1,𝑐𝑜𝑠𝑡+1,(2𝑥,𝑐𝑜𝑠𝑡+1)入队
*/

#include <bits/stdc++.h>
using namespace std;
struct Pos {
    int x, cost;
    Pos(int ax = 0, int acost = 0) {
        x = ax, cost = acost;
    }
};
int n;
bool vis[1000005];
void bfs() {
    queue <Pos> q;
    q.push(Pos(1, 0));
    while(!q.empty()) {
        Pos now = q.front();
        q.pop();
        int x = now.x, cost = now.cost;
        if(x < 1 || x > n) // 处理越界，如果 x 不在 [1,n] 范围内
            continue;           
        if(vis[x]) // 用 vis 数组判断重复
            continue; 
        vis[x] = true; // 用 vis 数组标记这个数字被访问过

        if(x == n) {
            cout << cost << endl;
            return;
        }
        q.push(Pos(x - 1, cost + 1));
        q.push(Pos(x + 1, cost + 1));
        q.push(Pos(2 * x, cost + 1));
    }
}
int main() {
    cin >> n;
    bfs();
    return 0;
}
/*
g++ bfs/bfs_3.cpp && echo 60 | ./a.out
样例输出： 7
*/